package document

import (
	"github.com/gin-gonic/gin"
	"net/http"
	"one-wiki/commons"
	"one-wiki/logic"
	"strconv"
)

// DocumentHandlersInit 绑定文档相关接口
func DocumentHandlersInit(engine *gin.Engine) {
	// ============文档相关================
	// 获取文档
	engine.GET("/document/:id", getDocument)
	// 编辑文档
	engine.POST("/document/:id/edit", editDocument)
	// 移动文档
	engine.POST("/document/:id/move", moveDocument)
	// 修改权限 TODO待定
	engine.POST("/document/:id/permission", updateDocument)
	// 删除文档
	engine.DELETE("/document/:id", deleteDocument)
	// 新增文档
	engine.PUT("/document", createDocument)

	// ============目录相关================
	// 全部目录
	engine.GET("/catalog", catalogAll)
	// 指定下级目录
	engine.GET("/catalog/:parentId", catalog)

}

// 获取文档信息
func getDocument(context *gin.Context) {
	// 获取Session
	value, exists := context.Get(commons.KEY_SESSION)
	if !exists {
		panic(commons.UnAuthorizationErr)
	}
	localSession, ok := value.(commons.Session)
	if !ok {
		panic(commons.ServerError)
	}

	id := context.Param("id")
	atoi, _ := strconv.Atoi(id)
	context.JSON(http.StatusOK, logic.GetDocument(localSession, int64(atoi)))
}

// 移动文档
func moveDocument(context *gin.Context) {
	// url参数
	urlId := context.Param("id")
	id, _ := strconv.Atoi(urlId)

	// 接收Json参数
	var documentParam commons.DocumentRequest
	if err := context.ShouldBindJSON(&documentParam); err != nil {
		panic(commons.InvalidErr)
	}

	// 组合参数
	documentParam.Id = int64(id)

	// 移动
	logic.MoveDocument(documentParam)

	// 响应
	context.JSON(http.StatusOK, "移动成功")
}

// 更新文档
func updateDocument(context *gin.Context) {
	// url参数
	urlId := context.Param("id")
	id, _ := strconv.Atoi(urlId)

	// 接收Json参数
	var documentParam commons.DocumentRequest
	if err := context.ShouldBindJSON(&documentParam); err != nil {
		panic(commons.InvalidErr)
	}

	// 组合参数
	documentParam.Id = int64(id)

	// TODO
	logic.UpdateDocument(documentParam)

	// 响应
	context.JSON(http.StatusOK, "移动成功")
}

// 更新文档
func editDocument(context *gin.Context) {
	// url参数
	urlId := context.Param("id")
	id, _ := strconv.Atoi(urlId)

	// 接收Json参数
	var documentParam commons.DocumentRequest
	if err := context.ShouldBindJSON(&documentParam); err != nil {
		panic(commons.InvalidErr)
	}

	// 组合参数
	documentParam.Id = int64(id)

	logic.EditDocument(documentParam)

	context.JSON(http.StatusOK, nil)
}

// 删除文档
func deleteDocument(context *gin.Context) {
	// 查询逻辑
	id := context.Param("id")
	atoi, _ := strconv.Atoi(id)

	logic.DeleteDocument(int64(atoi))

	context.Status(http.StatusOK)
}

// 新增文档
func createDocument(context *gin.Context) {
	// 接收Json参数
	var documentParam commons.DocumentRequest
	if err := context.ShouldBindJSON(&documentParam); err != nil {
		panic(commons.InvalidErr)
	}
	logic.AddDocument(documentParam)

}

// 文档全部目录
func catalogAll(context *gin.Context) {
	// 获取Session
	value, exists := context.Get(commons.KEY_SESSION)
	if !exists {
		panic(commons.UnAuthorizationErr)
	}
	localSession, ok := value.(commons.Session)
	if !ok {
		panic(commons.ServerError)
	}

	// 查询逻辑
	context.JSON(http.StatusOK, logic.CatalogAll(localSession))
}

// 下级目录
func catalog(context *gin.Context) {
	// 如果传递的id是空，默认为0
	parentId := context.Param("parentId")
	if parentId == "" {
		parentId = "0"
	}
	// TODO 查询逻辑
	context.JSON(http.StatusNotFound, "接口尚未实现")
}
